package engine;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.SwingWorker;
import ui.UserInterface;
import utilities.FileTools;

public class Corpus extends SwingWorker<Void, Integer> {

    private String corpusPath;//dossier des documents
    private ArrayList<Document> docs;//documents du corpus
    private HashMap<String, Integer> tfMap;//Terme Frequency
    private HashMap<String, Integer> dfMap;//Document Frequency
    private int nbMotUniques;//mots uniques
    private int nbMotTotal;//mots total
    private UserInterface guiToUpdate;

    public Corpus(String corpusPath) {
        this.corpusPath = corpusPath;
        this.tfMap = null;
        this.dfMap = null;
    }

    public ArrayList<Document> getDocs() {
        return docs;
    }

    public String getCorpusPath() {
        return corpusPath;
    }

    public int getNbMotUniques() {
        return nbMotUniques;
    }

    public int getNbMotTotal() {
        return nbMotTotal;
    }

    public void setGuiToUpdate(UserInterface guiToUpdate) {
        this.guiToUpdate = guiToUpdate;
    }

    public HashMap<String, Integer> getTfMap() {
        return tfMap;
    }

    public HashMap<String, Integer> getDfMap() {
        return dfMap;
    }

    @Override
    protected Void doInBackground() throws Exception { //fillTfAndDfMap
        this.tfMap = new HashMap<String, Integer>();
        this.dfMap = new HashMap<String, Integer>();
        this.docs = new ArrayList<Document>();

        HashMap<String, Object> motsUniquesDocument = new HashMap<String, Object>();

        int compteur = 0;
        int progress;

        //Fichiers du corpus
        ArrayList<File> files = new ArrayList<File>();
        FileTools.findFiles(corpusPath, files);

        //Parcours des fichiers
        Document currentDocument;
        for (File file : files) {
            //Création d'un objet Document pour le fichier courant
            currentDocument = new Document(file.getAbsolutePath());
            currentDocument.fillTfMap();

            motsUniquesDocument.clear();

            for (String mot : currentDocument.getTfMap().keySet()) {
                //Fill TF
                tfMap.put(mot, tfMap.containsKey(mot) ? tfMap.get(mot) + currentDocument.getTfMap().get(mot) : 1);
                
                //Fill DF
                motsUniquesDocument.put(mot, null);
            }

            //Fill DF
            for (String motUnique : motsUniquesDocument.keySet()) {
                dfMap.put(motUnique, dfMap.containsKey(motUnique) ? dfMap.get(motUnique) + 1 : 1);
            }

            //Ajout du document courant dans le corpus (couteux en mémoire)
            this.docs.add(currentDocument);

            compteur++;
            progress = (int) ((double) compteur * 100 / (double) files.size());
            publish(progress);
            //System.out.println("Progress : " + progress);
        }

        //Fill nbMotTotal & nbMotUniques
        this.nbMotUniques = getTfMap().entrySet().size();

        int somme = 0;
        for (Map.Entry<String, Integer> entry : getTfMap().entrySet()) {
            somme += entry.getValue();
        }

        this.nbMotTotal = somme;

        //Update GUI
        guiToUpdate.updateNbMots(this.nbMotTotal, this.nbMotUniques);

        //MapTools.printMap(MapTools.getSortedMap(this.tfMap));

        return null;
    }

    @Override
    protected void process(List<Integer> values) {
        for (Integer val : values) {
            guiToUpdate.updateProgressBarReadFiles(val);
        }
    }

    @Override
    protected void done() {
        guiToUpdate.tfAndDfAreFilled();
    }
}
